package dao;

import java.io.Serializable;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import javax.annotation.Resource;

import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.stereotype.Repository;

import entity.Admin;

@Repository("adminDao")
public class AdminDao implements Serializable {
	/**
	 * JdbcTemplate提供了很多方法
	 * 		这些方法对jdbc api做了封装，从而简化了代码；不再需要考虑获取连接，关闭连接。
	 * 另外，如果发生了异常，会自动封装成RuntimeException然后抛出
	 * @param emp
	 */
	@Resource(name="jt")
	private JdbcTemplate jt;
	
	/**
	 * 向数据库插入数据
	 * @param 
	 */
	public void insert(Admin admin) {
		String sql = "INSERT INTO admin "
				+ "(name, password, gender) "
				+ "VALUES "
				+ "(?,?,?) ";
		Object [] args = {admin.getName(), admin.getPassword(), admin.getGender()};
		jt.update(sql, args); // update() 这个方法可以完成：插入 删除 修改 都能完成
	} 
	
	/**
	 * 查询数据库中的所有数据
	 * @return
	 */
	public List<Admin> findAll() {
		List<Admin> admins = new ArrayList<Admin>();
		String sql = "SELECT * "
				+ "FROM admin ";
		admins = jt.query(sql, new AdminRowMapper());  // query() 方法可以实现 查询 功能
		return admins;
	}
	
	/**
	 * 查询满足条件的员工信息（bug版）
	 * @param id
	 * @return
	 */
	public Admin findById(Integer id) {
		Admin admin = null;
		String sql = "SELECT * "
				+ "FROM admin "
				+ "WHERE id = ? ";
		Object [] args = {id};
		admin = jt.queryForObject(sql, args, new AdminRowMapper());
		return admin;
	}
	
//	查询满足条件的用户所有信息（加强版）
	public Admin findById2(Integer id) {
		Admin admin = null;
		String sql = "SELECT * "
				+ "FROM admin "
				+ "WHERE id = ? ";
		Object [] args = {id};
		List<Admin> admins = jt.query(sql, args, new AdminRowMapper());
		if(admins != null && admins.size() > 0) {
			admin = admins.get(0);
		}
		return admin;
	}
	
//	修改满足指定条件的员工信息
	public void modify(Admin admin){
		String sql = "UPDATE admin "
				+ "SET name = ?, gender = ? "
				+ "WHERE id = ? ";
		Object[] args = {admin.getName(), admin.getGender(), admin.getId()};
		jt.update(sql, args);
	}
	
//	删除满足指定条件的员工信息
	public void delete(Integer id) {
		String sql = "DELETE FROM "
				+ "admin "
				+ "WHERE id = ? ";
		Object [] args = {id};
		jt.update(sql, args);
	}
	
	
	
//	编写一个内部类：需要实现RowMapper接口
//	该类的作用：告诉spring怎么将数据库中的记录变成对象
	class AdminRowMapper implements RowMapper<Admin> {
//		rs:查询到的结果集
//		rowNum:记录的下标（从0开始）
		public Admin mapRow(ResultSet rs, int rowNum) throws SQLException {
			Admin admin = new Admin();
			admin.setId(rs.getInt("id"));
			admin.setName(rs.getString("name"));
			admin.setPassword(rs.getString("password"));
			admin.setGender(rs.getString("gender"));
			return admin;
		}
	}
	
}
